import pandas as pd
import matplotlib.pyplot as plt

plt.rc("font", family='MicroSoft YaHei', weight="bold")

# 问题1:
file_path = './超市营业额2.xlsx'
df = pd.read_excel(file_path, sheet_name='Sheet1')
df.drop_duplicates(inplace=True)
df['交易额'] = df.groupby('工号')['交易额'].transform(lambda x: x.fillna(x.median()))
df['交易额'] = df['交易额'].apply(lambda x: max(500, min(x, 3000)))
out_file_path = './数据调整结果.xlsx'
df.to_excel(out_file_path, index=False)
print("数据处理完毕，已保存到:", out_file_path)


# 问题2:
df = pd.read_excel(out_file_path)
# 计算每天的总交易额
daily_totals = df.groupby('日期')['交易额'].sum().reset_index()
# 找出交易总额最小的三天
min_days = daily_totals.nsmallest(3, '交易额')
# 获取这三天的交易数据
min_days_data = df[df['日期'].isin(min_days['日期'])]
# 获取这三天的星期几
min_days['周几'] = pd.to_datetime(min_days['日期']).dt.day_name()
# 输出结果
print("交易总额最小的3天的交易数据：")
print(min_days_data)
print("\n这三天是周几：")
print(min_days[['日期', '交易额', '周几']])


# 问题3:
# 定义一个函数来修改工号
def modify_id(employee_id):
    last_digit = str(employee_id)[-1]  # 获取工号最后一位
    new_id = last_digit + str(employee_id)  # 在前面加上最后一位
    return int(new_id)  # 返回修改后的工号

# 应用函数修改工号
df['工号'] = df['工号'].apply(modify_id)

# 将修改后的数据写入新文件
new_file_path = './超市营业额2_修改工号.xlsx'
df.to_excel(new_file_path, index=False)

print("工号修改完成，已保存到:", new_file_path)


# 问题4:
# 创建一个新的 Excel 文件
new_file_path = './各员工数据.xlsx'

# 使用 ExcelWriter 创建 Excel 文件并写入每个员工的数据
with pd.ExcelWriter(new_file_path) as writer:
    for name, group in df.groupby('姓名'):  # 按姓名分组
        group.to_excel(writer, sheet_name=name, index=False)  # 将每个员工的数据写入对应的工作表

print("各员工的数据已保存到:", new_file_path)


# 问题5:
# 将日期列转换为字符串格式（如果它不是字符串）
df['日期'] = df['日期'].astype(str)
# 筛选日期尾数为6的数据
filtered_data = df[df['日期'].str.endswith('6')]
# 提取前12行
result = filtered_data.head(12)
# 输出结果
print(result)


# 问题6:
df['日期'] = df['日期'].astype(str)
# 筛选日期尾数为12的数据
filtered_data = df[df['日期'].str.endswith('12')]
# 输出结果
print(filtered_data)


# 7. 计算张三的增幅
zhangsan = df[df['姓名'] == '张三'].groupby('日期')['交易额'].sum().sort_index()
zhangsan_increase = zhangsan.diff().head(5)
print(zhangsan_increase)


# 问题8:
daily_counter = df.groupby(['日期', '柜台'])['交易额'].sum().unstack()
daily_counter.plot(kind='line')
plt.title("各柜台营业额每天变化趋势")
plt.xticks(rotation=45)
plt.savefig("1.png", dpi=200)
plt.close()


# 问题9
total_sales = df.groupby('柜台')['交易额'].sum()
total_sales.plot(kind='pie', autopct='%1.1f%%')
plt.title("各柜台营业额占比")
plt.savefig("2.png", dpi=200)
plt.close()

# 问题10
low_performance = df.groupby('工号')['交易额'].sum().reset_index()
low_performance = low_performance[low_performance['交易额'] < 50000]
low_performance.to_csv("业绩差的员工.txt", header=False, index=False)

# 问题11
employee_sales = df.groupby(['姓名', '柜台'])['交易额'].sum().unstack()
employee_sales.plot(kind='bar')
plt.title("每个员工在不同柜台上的交易总额")
plt.savefig("3.png", dpi=200)
plt.close()

# 问题12
pivot_table = df.pivot_table(index='姓名', columns='柜台', values='工号', aggfunc='count', fill_value=0)
print(pivot_table)  